﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using Fatec.ControleEstoque.Attributes;
using Fatec.ControleEstoque.Attributes.Security;
using System.Data;

namespace Fatec.ControleEstoque.Data.Model
{
    [Security(Role = "Usuarios", Action = "All")]
    [DisplayName("Usuários")]
    [MetadataType(typeof(UsuariosMetadata))]
    public partial class Usuarios : IValidatable
    {
        public class UsuariosMetadata
        {
            [ScaffoldColumn(false)]
            public object Id { get; set; }

            [DisplayName("Login")]
            public object User { get; set; }
            
            public object Nome { get; set; }

            [HideColumnIn(PageTemplate.List, PageTemplate.Details)]
            [UIHint("Password")]
            public object Password { get; set; }

            [DisplayName("Data de Cadastro")]
            [DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")]
            [HideColumnIn(PageTemplate.Edit, PageTemplate.Insert)]
            public object Dt_Cadastro { get; set; }

            [ScaffoldColumn(false)]
            public object Pedidos { get; set; }

            [UIHint("ManyToMany")]
            public object Funcoes { get; set; }

        }


        #region IValidatable Members

        public bool Validate(EntityState state)
        {
            if (state == EntityState.Deleted)
            {
                Usuarios userExc = EstoqueEntities.Context.Usuarios.Where(u => u.Id == this.Id).FirstOrDefault();
                userExc.Pedidos.Load();
                if (userExc.Pedidos.Count > 0)
                {
                    ExceptionMessage = "Existem pedidos relacionados a este usuário, a operação não poderá ser concluída.";
                }
                else
                {
                    userExc.Funcoes.Load();
                    for (int i = 0; i < userExc.Funcoes.Count; i++)
                    {
                        userExc.Funcoes.Remove(userExc.Funcoes.ToArray()[0]);
                    }
                    EstoqueEntities.Context.SaveChanges();
                }
            }
            else
            {
                if (Dt_Cadastro == null || Dt_Cadastro == DateTime.MinValue) Dt_Cadastro = DateTime.Today;

                if (Funcoes.Count == 0)
                {
                    ExceptionMessage = "É necessário associar o usuário a uma função pelo menos.";
                }
            }

            return string.IsNullOrEmpty(ExceptionMessage);
        }

        public string ExceptionMessage{get;set;}
        
        #endregion
    }

}
